package com.lemon.core.base.util;

import java.util.ArrayList;
import java.util.List;

/**
 * 切割字符串的工具类，用于替换jdk的split方法
 *
 * @author pan
 * @since 2015-10-30
 */
public class SplitUtils {

    /**
     * 获取字段个数
     *
     * @param s     原字符串
     * @param str   分隔符
     * @param limit 末尾是否以分隔符结尾
     * @return 字段个数
     */
    private static int count(String s, String str, int limit) {
        int k = 0;

        for (int index = 0; ; index += str.length()) {
            index = s.indexOf(str, index);
            if (index == -1) {
                break;
            }
            k++;
        }
        return limit < 1 ? ++k : k;
    }

    /**
     * 按分隔符分割字符串，取代jdk的String.split方法
     *
     * @param str    待分割字符串
     * @param split  分隔符
     * @param length 分隔符长度
     * @return 字符串数组
     */
    public static String[] split(String str, String split, int length) {
        if (!str.endsWith(split)) {
            str += split;
        }
        return split(str, split, length, 1);
    }

    /**
     * 按分隔符分割字符串，取代jdk的String.split方法
     *
     * @param str    待分割字符串
     * @param split  分隔符
     * @param length 分隔符长度
     * @param limit  是否以分隔符结尾 (1是,0否)
     * @return 字符串数组
     */
    public static String[] split(String str, String split, int length, int limit) {
        String[] array = new String[count(str, split, limit)];

        if (array.length == 0) {
            return new String[0];
        }
        int index = 0;
        int offset = 0;
        int i = 0;

        while ((index = str.indexOf(split, offset)) != -1) {
            array[i] = str.substring(offset, index);
            offset = index + length;
            i++;
        }
        if (limit < 1) {
            array[array.length - 1] = str.substring(str.lastIndexOf(split) + length);
        }
        return array;
    }

    /**
     * 按分隔符分割字符串，取代jdk的String.split方法
     *
     * @param str    待分割字符串
     * @param list   存储分割后的字符串集合
     * @param split  分隔符
     * @param length 分隔符长度
     * @param limit  是否以分隔符结尾 (1是,0否)
     */
    public static void split(String str, List<String> list, String split, int length, int limit) {
        if (list == null) {
            throw new NullPointerException();
        }
        int index = 0;
        int offset = 0;

        while ((index = str.indexOf(split, offset)) != -1) {
            list.add(str.substring(offset, index));
            offset = index + length;
        }
        if (limit < 1) {
            list.add(str.substring(str.lastIndexOf(split) + length));
        }
    }

    /**
     * 按分隔符分割字符串，取代jdk的String.split方法
     *
     * @param str   待分割字符串
     * @param split 分隔符
     */
    public static List<String> splitToList(String str, String split) {
        return splitToList(str, split, true);
    }

    /**
     * 按分隔符分割字符串，取代jdk的String.split方法
     *
     * @param str   待分割字符串
     * @param split 分隔符
     * @param limit 是否以分隔符结尾
     */
    public static List<String> splitToList(String str, String split, boolean limit) {
        List<String> list = new ArrayList<>();
        int index = 0;
        int offset = 0;

        int length = split.length();
        while ((index = str.indexOf(split, offset)) != -1) {
            list.add(str.substring(offset, index));
            offset = index + length;
        }
        if (!limit) {
            list.add(str.substring(str.lastIndexOf(split) + length));
        }
        return list;
    }

    public static void split(String str, List<String> list, String split) {
        split(str, list, split, split.length(), 0);
    }

    /**
     * 按分隔符分割字符串，取代jdk的String.split方法
     *
     * @param str    待分割字符串
     * @param list   存储分割后的字符串集合
     * @param split  分隔符
     * @param length 分隔符长度
     */
    public static void split(String str, List<String> list, String split, int length) {
        if (!str.endsWith(split)) {
            str += split;
        }
        split(str, list, split, length, 1);
    }

}
